package io;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 包装流- ObjectOutputStream
 */
public class ObjectOutputStream_ {

    public static void main(String[] args) throws Exception {

        /*
            需求：
            1.将 int num = 100 这个int数据保存到文件中，不是100数字 而是int 100，并且能够从文件中直接恢复 int 100
            2.将 Dog dog = new Dog("小黄", 3) 这个dog对象保存到文件中，并且能够从文件中恢复
            3.上述要求 其实就是能够将 基本数据类型 或者 对象 进行 序列化 和 反序列化
         */

        /*
            1.序列化就是在保存数据时，保存数据的值和数据类型 ObjectOutputStream支持
            2.反序列化就是在恢复数据时，恢复数据的值和数据类型 ObjectInputStream支持
            3.需要让某个对象支持序列化机制，则必须让其类是可序列化的，可以实现下面两个接口之一
              Serializable  //是一个标记接口(没有方法)
              Externalizable    //有方法需要实现，推荐使用Serializable
         */

        /*
            例：使用ObjectOutputStream 序列化 基本数据类型和一个 Dog 对象(name age)
            并且保存到data.txt 中
         */

        //序列化后，保存的文件格式不是纯文本
        String filePath = "D:\\IdeaCode\\javaStudy\\data.txt";

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));

        //序列化数据到 D:\IdeaCode\javaStudy\data.txt
        oos.writeInt(100);// int -> Integer (实现了 Serializable 接口)
        oos.writeBoolean(true);// boolean -> Boolean
        oos.writeChar('a');//   char -> Character
        oos.writeDouble(9.5);// double -> Double
        oos.writeUTF("LMY");    // String

        //保存对象
        oos.writeObject(new Dog("旺财", 10));

        oos.close();
        System.out.println("数据保存完毕(序列化形式)");
    }
}

//如果需要序列化某个类的对象，必须实现 Serializable 接口
class Dog implements Serializable {

    private String name;

    private int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}